package com.kang.service.impl;

import com.kang.service.UsersService;
import com.kang.commons.Result;
import com.kang.commons.util.*;
import com.kang.bean.Users;
import com.kang.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.*;

/**
 * @program: photo_fawu
 * @description:
 * @author: K.faWu
 * @create: 2021-11-04 16:59
 **/
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private SMSUtil smsUtil;
    @Autowired
    private QiniuUtil qiniuUtil;
    @Autowired
    private UsersService usersService;

//    @Override
//    public void register(UsersVo usersVo) {
//        String code = (String)redisUtil.getStringObject(usersVo.getPhone());
//        if (code == null || !code.equals(usersVo.getCode())){
//            Result.error("验证码错误");
//        }
//        QueryWrapper<Users> usersQueryWrapper = new QueryWrapper<>();
//        usersQueryWrapper.eq("phone", usersVo.getPhone());
//        if (!ObjectUtils.isEmpty(usersMapper.selectOne(usersQueryWrapper))){
//            Result.error("该手机号已注册！");
//        }
//        usersMapper.insert(usersVo);
//
//    }
//
//    @Override
//    public String getVerificationCode(String phone) {
//        QueryWrapper<Users> wrapper = new QueryWrapper<>();
//        wrapper.eq("phone", phone);
//        Users users = usersMapper.selectOne(wrapper);
//        String time = "5";
//        String resutl = null;
//        if (ObjectUtils.isEmpty(users)){
//            String code = smsUtil.sendSMS(phone,time, SMSUtil.REGISTER);
//            // 短信发送成功后将验证码保存在redis数据库中
//            redisUtil.setStringObjectByMinutes(phone,code,Integer.valueOf(time));
//        }else {
//            resutl = "该手机号已注册！";
//        }
//        return resutl;
//    }

//    @Override
//    public String login(UsersVo usersVo) {
//        log.info("用户登录：{}",usersVo.getPhone());
//        QueryWrapper<Users> usersQueryWrapper = new QueryWrapper<>();
//        usersQueryWrapper.eq("phone", usersVo.getPhone());
//        Users users = usersMapper.selectOne(usersQueryWrapper);
//        if ("111111".equals(usersVo.getCode())){
//            // 密码登录
//            //解密的密码
//            String decrypt = AesEncryptUtil.desEncrypt(usersVo.getPassword());
//            if (users == null || !users.getPassword().equals(decrypt)) {
//                log.warn("用户{},手机号或密码错误！",usersVo.getPhone());
//                return "手机号或密码错误！";
//            }
//        }else{
//            // 验证码登录
//            String code = (String)redisUtil.getStringObject(usersVo.getPhone());
//            if (users == null ||code == null || !code.equals(usersVo.getCode())){
//                log.warn("用户{},手机号或验证码错误！",usersVo.getPhone());
//                return "验证码错误";
//            }
//
//        }
//        ServletRequestAttributes sre = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); // 请求参数
//        HttpServletRequest request = sre.getRequest();
//        String ip = IpUtil.getIpAddr(request); // 发送请求的IP地址
//        /**
//         * 登录成功后将登录的手机号和对应的IP地址存到redis中
//         */
//        redisUtil.setStringObjectByHours(ip,users.getId(),24);
//        //创建AccessToken
//        AccessToken accessToken = new AccessToken(users.getId());
//        String json = JSONObject.toJSONString(accessToken);
//        return EncryptUtil.encrypt(json);
//    }

//    @Override
//    public Users getUsers(HttpServletRequest request) {
//        return null;
//    }

//    @Override
//    public Users isUsers(HttpServletRequest request){
//        String ip = IpUtil.getIpAddr(request);
//        log.info("IP查询是否登录：{}",ip);
//        Long id = (Long)redisUtil.getStringObject(ip);
//        if (null == id){
//            Result.error("未登录用户，或用户登录已过期");
//            return null;
//        }
//        QueryWrapper<Users> usersQueryWrapper = new QueryWrapper<>();
//        usersQueryWrapper.eq("id", id);
//        Users users = usersMapper.selectOne(usersQueryWrapper);
//        if (ObjectUtils.isEmpty(users)) {
//            Result.error("未登录用户，或用户登录已过期");
//            return null;
//        }
//        return users;
//    }
//
    @Override
    public Users getUsersById(Long id) {
        Result result = usersService.getUsersById(id);
        Users users = new Users();
        if (result.getCode() == 200) {
            try {
                users = MapToObjUtil.map2Obj((Map<String, Object>) result.getData(), Users.class);
                users.setPassword(null);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                Result.error("用户登录错误！\n请联系管理员！");
            }
        } else {
            Result.error(result.getMsg());
        }

        return users;
    }

    @Override
    public String upload(MultipartFile file) {
        //文件名
        //获取文件名
        String originalFilename = file.getOriginalFilename();
        int i = originalFilename.lastIndexOf(".");
        String endName = originalFilename.substring(i);
        endName = endName.toLowerCase();
        //判断是否是指定类
        List<String> fileType = Arrays.asList(".gif", ".jpg", ".jfif", ".ico", ".png", ".bmp", ".svg");
        if (!fileType.contains(endName)) {
            Result.error("文件类型错误");
        }
        try {
            String path = qiniuUtil.setUploadManager(file.getInputStream());
            if (path == null){
                Result.error("输入的字符不能为空！");
            }
            return path;
        } catch (IOException e) {
            e.printStackTrace();
            Result.error("文件上传失败");
        } catch (Exception e) {
            e.printStackTrace();
            Result.error("文件上传失败");
        }
        return null;
    }

//    @Override
//    public List<Map<String, String>> getByPhone(String phone) {
//        QueryWrapper<Users> usersQueryWrapper = new QueryWrapper<>();
//        usersQueryWrapper.like("phone", phone);
//        List<Users> list = usersMapper.selectList(usersQueryWrapper);
//        List<Map<String,String>> maps = new ArrayList<>();
//        list.forEach(users -> {
//            HashMap<String, String> map = new HashMap<>();
//            map.put("value", users.getPhone());
//            map.put("friendId", users.getId().toString());
//            maps.add(map);
//        });
//        return maps;
//    }

//    @Override
//    public void updateUser(Users users) {
//        Users oldUser = usersMapper.selectById(users.getId());
//        usersMapper.updateById(users);
//    }

//    @Override
//    public PageInfo<List<Users>> getAll(Users users, Pageable page, HttpServletRequest request) {
//        String tokenHeader = request.getHeader("token");
//        // 解析token
//        String jsonToken = EncryptUtil.decrypt(tokenHeader);
//        AccessToken accessToken = JSONObject.parseObject(jsonToken, AccessToken.class);
//        // 获取用户名，验证用户名
//        Long userId = accessToken.getUserId();
//        Users loginUser = usersMapper.selectById(userId);
//        //用户不存在或者用户不是管理员
//        if (loginUser == null){
//            return null;
//        }
//
//        QueryWrapper<Users> wrapper = new QueryWrapper<>();
//        if (users.getPhone() != null)
//            wrapper.like("phone", users.getPhone());
//        if (users.getName() != null)
//            wrapper.like("name", users.getName());
//        PageHelper.startPage(page.getPageNumber(),page.getPageSize());
//        List<Users> list = usersMapper.selectList(wrapper);
//        PageInfo<List<Users>> pageInfo = new PageInfo(list);
//        return pageInfo;
//    }

//    @Override
//    public void outUser(HttpServletRequest request) {
//        Users users = this.getUsers(request);
//        String ip = IpUtil.getIpAddr(request); // 发送请求的IP地址
//        redisUtil.delectStringObject(ip, users.getId());
//    }

//    @Override
//    public void isRole(HttpServletRequest request) {
//        Users users = this.isUsers(request);
//        /*if (users.getRole() != 0){
//            Result.error("权限不足！");
//        }*/
//    }

//    @Override
//    public String getLoginCode(String phone) {
//        QueryWrapper<Users> wrapper = new QueryWrapper<>();
//        wrapper.eq("phone", phone);
//        Users users = usersMapper.selectOne(wrapper);
//        String time = "5";
//        if (!ObjectUtils.isEmpty(users)){
//            String code = smsUtil.sendSMS(phone,time, SMSUtil.LOGIN);
//            // 短信发送成功后将验证码保存在redis数据库中
//            redisUtil.setStringObjectByMinutes(phone,code,Integer.valueOf(time));
//            return code;
//        }else {
//            return "该手机号未注册！";
//        }
//    }

    /**
     * 发送祝福短信
     */
//    @Override
//    public void sendUserBirth() {
//        SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd");
//        String format = dateFormat.format(new Date());
//        QueryWrapper<Users> wrapper = new QueryWrapper<>();
//        wrapper.likeLeft("birth", format);
//        List<Users> list = usersMapper.selectList(wrapper);
//        if (!ObjectUtils.isEmpty(list)){
//            list.forEach(users -> {
//                String s = smsUtil.sendBirthSMS(users.getPhone(), users.getName());
//                if ("success".equals(s)){
//                    log.info("向用户{}发送生日祝福短信完成", users.getPhone());
//                }else {
//                    log.error("向用户{}发送生日祝福短信失败！",users.getPhone());
//                }
//            });
//        }
//    }

    @Override
    public Users getUsers(HttpServletRequest request) {
        String token = request.getHeader("token");
        if (token ==null){
            Result.error("未登录账号！");
        }
        Users users = null;
        try {
            Result result = usersService.getUsers2(token);
            if (result.getCode() == 200) {
                try {
                    users = MapToObjUtil.map2Obj((Map<String, Object>) result.getData(), Users.class);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                    Result.error("用户登录错误！\n请联系管理员！");
                }
            } else {
                Result.error(result.getMsg());
            }
        }catch (Exception e){
            e.printStackTrace();
            Result.error(e.getMessage());
        }
        return users;
    }
}
